/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aprendizajePorRefuerzo.agente;

import aprendizajePorRefuerzo.accion.Accion;
import aprendizajePorRefuerzo.estado.Estado;
import aprendizajePorRefuerzo.reward.Reward;

/**
 *
 * @author Fernando Sorzana
 */
public class AgenteQLearning extends AgenteImp{
    
    @Override
    public void aprender(Estado estado, Reward reward){
        Accion maxima = getAccionesPosibles().iterator().next();
        for (Accion a : getAccionesPosibles()){
            if (getFuncionQ().getValor(estado, a) > getFuncionQ().getValor(estado, maxima)){
                maxima = a;
            }
        }
        double qAnterior = getFuncionQ().getValor(getEstadoAnterior(), getAccionAnterior());
        double qMaxima = getFuncionQ().getValor(estado, maxima);
        getFuncionQ().setValor(getEstadoAnterior(), getAccionAnterior(), qAnterior + getAlfa() * (reward.getValor() + getGamma() * qMaxima - qAnterior));
    }

    @Override
    public String toString() {
        return "Agente Q-Learning";
    }
    
}
